﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HandleServer
{
    public class TcpPacket
    {
        // 包头：0xFFFF（2字节）
        public static readonly byte[] Header = { 0xFF, 0xFF };
        // 包尾：0xEEEE（2字节）
        public static readonly byte[] Footer = { 0xEE, 0xEE };

        public byte Command { get; set; }     // 命令编号（1字节）
        public byte[] Data { get; set; }      // 数据内容（长度由数据长度字段决定）

        /// <summary>
        /// 序列化数据包
        /// </summary>
        public byte[] Serialize()
        {
            using (var ms = new MemoryStream())
            using (var writer = new BinaryWriter(ms))
            {
                // 包头
                writer.Write(Header);

                // 数据长度（4字节，大端序）
                uint dataLength = (uint)Data.Length;
                byte[] lengthBytes = BitConverter.GetBytes(dataLength);
                if (BitConverter.IsLittleEndian)
                {
                    Array.Reverse(lengthBytes);
                }
                writer.Write(lengthBytes);

                // 命令编号（1字节）
                writer.Write(Command);

                // 数据内容
                writer.Write(Data);

                // 包尾
                writer.Write(Footer);

                return ms.ToArray();
            }
        }

        /// <summary>
        /// 反序列化数据包
        /// </summary>
        public static TcpPacket Deserialize(byte[] rawBytes)
        {
            using (var ms = new MemoryStream(rawBytes))
            using (var reader = new BinaryReader(ms))
            {
                // 1. 检查包头
                byte[] header = reader.ReadBytes(2);
                if (!header.SequenceEqual(Header))
                {
                    throw new InvalidDataException("Invalid packet header.");
                }

                // 2. 读取数据长度（4字节，大端序）
                byte[] lengthBytes = reader.ReadBytes(4);
                if (BitConverter.IsLittleEndian)
                {
                    Array.Reverse(lengthBytes);
                }
                uint dataLength = BitConverter.ToUInt32(lengthBytes, 0);

                // 3. 读取命令编号（1字节）
                byte command = reader.ReadByte();

                // 4. 读取数据内容
                byte[] data = reader.ReadBytes((int)dataLength);

                // 5. 检查包尾
                byte[] footer = reader.ReadBytes(2);
                if (!footer.SequenceEqual(Footer))
                {
                    throw new InvalidDataException("Invalid packet footer.");
                }

                return new TcpPacket
                {
                    Command = command,
                    Data = data
                };
            }
        }
    }
}
